home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / lcppb.zip / LCPPLIB.ZIP / LIST.CPP < prev    next >
C/C++ Source or Header  |  1991-07-04  |  4KB  |  105 lines

  1. // list.cpp -- List class
  2.  
  3. #include <stddef.h>
  4. #include "list.h"
  5.  
  6. /* -- List constructor. Initializes an empty list when the list
  7. object comes into being (i.e. is allocated storage). Note: because
  8. a list is a descendant of an item, the item class constructor also
  9. runs before the list constructor. */
  10.  
  11. list::list()
  12. {
  13.   anchor = cip = NULL;    // No listed or current items
  14. }
  15.  
  16. /* -- List destructor. Like a snake eating itself by the tail, the
  17. destructor disposes of all items (if any) on the list, and then
  18. disposes of itself. */
  19.  
  20. list::~list()
  21. {
  22.   if (anchor != NULL)
  23.     disposeList();
  24. }
  25.  
  26. /* -- Insert a new item addressed by ip into a list object. The new
  27. item is linked in front of (to the left of) the current item. To
  28. link an item after another, find that item and call nextItem before
  29. calling insertItem. Does nothing if argument is NULL. If list is
  30. empty, then a new list is created with the single item at ip. Returns
  31. address of inserted item or NULL.*/
  32.  
  33. item *list::insertItem(item *ip)
  34. {
  35.   if (ip == NULL)             // Ignore request to insert
  36.     return NULL;              //  a NULL item.
  37.   if (anchor == NULL)         // If list is empty...
  38.     return anchor = cip = ip; //  start a new list
  39.   return ip->link(cip);       // Else, link item into list
  40. }
  41.  
  42. /* -- Remove the item addressed by ip from the list object. Also
  43. adjust the anchor and cip pointers to make sure they do not address
  44. the unlinked item. If the addressed item is the only one in the list,
  45. then this function empties the list. Does NOT dispose the unlinked
  46. item or call its destructor. After calling removeItem, the item
  47. addressed by ip points to itself, and it can be used to begin a new
  48. list, or it can be used as a free-floating object. Returns NULL or
  49. the address of the removed item. */
  50.  
  51. item *list::removeItem(item *ip)
  52. {
  53.   if (ip == NULL)             // Ignore request to remove
  54.     return NULL;              //  a NULL item.
  55.   if (ip->right == ip)        // If list has only one item...
  56.     anchor = cip = NULL;      //  then empty the list
  57.   else {
  58.     if (ip == anchor)         // Else adjust anchor and
  59.       anchor = anchor->right; //  cip pointers to ensure
  60.     if (cip == ip)            //  they do not address the 
  61.       cip = cip->right;       //  unlinked item.
  62.   }
  63.   return ip->unlink();        // Unlink item from list
  64. }
  65.  
  66. /* -- Return a pointer to the previous item, the one to the "left" of
  67. the current item. Also sets the current item pointer to that item.
  68. Returns NULL if list is empty. */
  69.  
  70. item *list::prevItem(void)
  71. {
  72.   if (cip != NULL)      // If list is not empty
  73.     cip = cip->left;    //  set cip to item at left.
  74.   return cip;           // Return current item pointer.
  75. }
  76.  
  77. /* -- Return a pointer to the next item, the one to the "right" of
  78. the current item. Also sets the current item pointer to that item.
  79. Returns NULL if list is empty. */
  80.  
  81. item *list::nextItem(void)
  82. {
  83.   if (cip != NULL)      // If list is not empty
  84.     cip = cip->right;   //  set cip to item at right.
  85.   return cip;           // Return current item pointer.
  86. }
  87.  
  88. /* -- Remove and delete all items (if any) in the list object. If
  89. items have destructors, they are called for each item. Items are not
  90. necessarily disposed in the order they were inserted. */
  91.  
  92. void list::disposeList(void)
  93. {
  94.   item *ip;
  95.  
  96.   while (!listEmpty())
  97.     delete removeItem(currentItem());
  98. }
  99.  
  100.  
  101. // Copyright (c) 1990 by Tom Swan. All rights reserved
  102. // Revision 1.00    Date: 09/03/1990   Time: 10:45 am
  103.  
  104.  
  105.